package cn.bblocks.common.i18n.config;

import cn.bblocks.common.i18n.I18nHolder;
import cn.hutool.core.collection.ListUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;


@ConfigurationProperties(prefix = "spring.ex.i18n")
@Data
public class I18nProperties {

    private static final String NAME_OF_LANGUAGE_SETTING = "lang";

    /**
     * 是否启用国际化功能：<br>
     *     - 启用：会创建和国际化相关的数据源、缓存等等；<br>
     *     - 不启用：{@link I18nHolder} 可以正常使用，返回原值，不会创建国际化相关的各种Bean<br>
     *
     *  默认：不启用，需要手动开启
     */
    private Boolean enable = false;

    /**
     * 语言参数名（将从request、cookie中提取当前语言环境）<br>
     *
     *  默认：lang
     */
    private String nameOfLanguageKey = NAME_OF_LANGUAGE_SETTING;

    /**
     * 国际化数据表所在的数据源，入需指定，则写入数据源名称。<br>
     *     此配置的作用是允许多个服务通过共享一个i18n配置表，从而共用一套i18n翻译。<br>
     *     默认为空，表示使用primary数据源。
     */
    private String dataSource = "primary";

    /**
     * 默认地区（语言）
     */
    private String defaultLocale = "zh_CN";

    /**
     * 查询i18n配置表的名称，用于自定义修改表。<br>
     *     默认：config_i18n_message
     */
    private String configTable = "config_i18n_message";

    /**
     * 当未找到i18n的code时，是否将其记录到表中，以便统一处理<br>
     * 切记如果组合使用本地国际化，本地国际化有个参数属性:use-code-as-default-message=true,会导致生成code作为消息内容，导致mark失效<br>
     *     默认：关闭
     */
    private Boolean mark = false;

    /**
     * 限制语言-否则可能出现大量错误码转义需求（en/zh）-仅限mark=true生效
     * 默认：en/zh-以及defaultLocale
     */
    private List<String> markLimitLanguages = ListUtil.of("en", "zh");

    /**
     * 用于记录无效code的线程池缓冲区大小（异步线程数量：1-2）
     */
    private Integer markPoolSize = 2000;

    /**
     * 是否在 {@link cn.bblocks.common.i18n.repository.I18nMessageResource} 未找到配置时，再使用Spring默认方案，
     *     从本地加载国际化资源。
     *  默认：关闭
     */
    private Boolean useLocale = false;

    /**
     * i18nDataSource 参数,如果为空/url为空 则不创建dataSource（i18nDataSource）,请确保driverClassName已加载
     */
    private I18NDb db = new I18NDb();

    /**
     * 更新cron，建议每天整点执行<br>
     *     默认：无
     */
    //0 0 */1 * * ?
    private String cron = "";

    @Data
    public static class I18NDb{

        /**
         *  driverClassName
         */
        private String driverClassName;

        /**
         * db url
         */
        private String url;

        /**
         * db 用户名
         */
        private String username;

        /**
         * db 密码
         */
        private String password;


    }
}
